#!/bin/sh

# Author: P@draigBrady.com
# V1.0  : Nov  3 2006
#
#  Execute a command with a timeout.
#  If the timeout occurs the exit status is 128
#
#  Note there is an asynchronous equivalent of this
#  script packaged with bash (under /usr/share/doc/ in my distro),
#  which I only noticed after writing this.

if [ "$#" -lt "2" ]; then
    echo "Usage:   `basename $0` timeout_in_seconds command" >&2
    echo "Example: `basename $0` 2 sleep 3 || echo timeout" >&2
    exit 1
fi

cleanup()
{
    kill %1 2>/dev/null             #kill sleep $timeout if running
    kill %2 2>/dev/null && exit 128 #kill monitored job if running
}

set -m               #enable job control
trap "cleanup" 17    #cleanup after timeout or command
timeout=$1 && shift  #first param is timeout in seconds
sleep $timeout&      #start the timeout
"$@"                 #start the job
